package com.jc.common.util;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import net.sf.jsqlparser.expression.StringValue;

/**********************************************
 * <p>
 * 说明：数字工具类
 * </p>
 * 
 * @date 2018年7月15日 上午11:08:33
 * @version 2.0.1 <br/>
 **********************************************
 */
public final class NumberUtils extends org.apache.commons.lang3.math.NumberUtils {
	
	
	
	
	
	
	/**
	 * 格式化工具集合
	 */
	private static final Map<String, NumberFormat> fmtMap = new HashMap<String, NumberFormat>();

	
	
	public static String getYuanByFen(int fen) {
		double d = Double.parseDouble(String.valueOf(fen));
		double y = d/100;
		return format(y,"#0.00");
	}
	/**
	 * @param pattern 格式表达式
	 * @return 数字格式化工具
	 */
	private static NumberFormat getFormat(String pattern) {
		NumberFormat fmt = fmtMap.get(pattern);
		if (fmt == null) {
			fmt = new DecimalFormat(pattern);
			fmtMap.put(pattern, fmt);
		}
		return fmt;
	}

	/**
	 * 按指定的样式格式化数字.<br>
	 * 例如: <br>
	 * <li><code>format(1,"#0.000")</code>,结果1.000
	 * <li><code>format(1.165686,"#0.000")</code>,结果1.166
	 * <li><code>format(0,"#0.00")</code>,结果0.00
	 * <li><code>format(0.2556,"#0.00%")</code>,结果25.56%
	 * <li><code>format(1,"#0%")</code>,结果100%
	 * 
	 * @param d double
	 * @param pattern 格式化字符串. 如:#0.000(带三位小数点,四舍五入)
	 * @return
	 */
	public static String format(double d, String pattern) {
		return getFormat(pattern).format(d);
	}

	/**
	 * {@link #format(double, String)}.
	 * 
	 * @param doubleStr
	 * @param pattern
	 * @return
	 */
	public static String format(String doubleStr, String pattern) {
		double d = 0;
		try {
			d = Double.parseDouble(doubleStr);
		} catch (NumberFormatException e) {
			System.out.println("字符串转换成数字有异常!  doubleStr=" + doubleStr);
		}
		return format(d, pattern);
	}

	/**
	 * 和 {@link #format(double, String)}相似,区别在于返回值增加了一个html的空格字符(&nbsp;).
	 * 
	 * @param d
	 * @param pattern
	 * @return 返回值增加了一个html格式的空格符(&nbsp;).
	 */
	public static String formatWithBlank(double d, String pattern) {
		return format(d, pattern) + "&nbsp;";
	}

	/**
	 * {@link #formatWithBlank(double, String)}
	 * 
	 * @param doubleStr
	 * @param pattern
	 * @return
	 */
	public static String formatWithBlank(String doubleStr, String pattern) {
		double d = 0;
		try {
			d = Double.parseDouble(doubleStr);
		} catch (NumberFormatException e) {
			System.out.println("字符串转换成数字有异常!  doubleStr=" + doubleStr);
		}
		return formatWithBlank(d, pattern);
	}

	/**
	 * 给数字字符后增加一个html格式的空格符(&nbsp;);<br>
	 * 用途:在将html页面导出excel格式时,excel会默认将数字字符串转换成数字,这样会导致字符串前后的00被清掉. 调用此方法,增加了一个空格字符后,可以避免excel的自动转换. 如:1.200,excel会自动转换成1.2; 00012,excel会自动转换成12;
	 * 
	 * @param numStr 数字字符串
	 * @return
	 */
	public static String addBlank(String numStr) {
		return numStr + "&nbsp;";
	}

	/***********************************************************
	 * isNumeric(判断字符串是否为纯数字)
	 * 如果str为空返回false
	 * @Title: isNumeric @Description: 判断字符串是否为纯数字 @param str @return 设定文件 boolean 返回类型 @throws
	 **********************************************************/
	public static boolean isNumeric(String str) {
		if(StringUtils.isBlank(str)){
			return false;
		}
		Pattern pattern = Pattern.compile("[0-9]*");
		Matcher isNum = pattern.matcher(str);
		if (!isNum.matches()) { return false; }
		return true;
	}

	/**
	 * <p>
	 * 是否为零
	 * </p>
	 *
	 * <pre>
	 * NumberUtils.isZero(null)      = true
	 * NumberUtils.isZero(0)        = true
	 * </pre>
	 * 
	 * @date 2015年7月15日 上午11:06:20
	 * @Title:isZero
	 * @param normalAmount
	 * @return boolean
	 */
	public static boolean isZero(Integer normalAmount) {
		return normalAmount == null || normalAmount.intValue() == 0;
	}
}
